﻿#include <iostream>
#include <assert.h>

using namespace std;
//参数类型不同
//int Add(int left, int right)
//{
//	cout << "int Add(int, int)";
//	return left + right;
//}
//
//double Add(double x1, double x2)
//{
//	cout << "double Add(double, double)";
//	return x1 + x2;
//}
//
//int main()
//{
//	cout << Add(1, 2) << endl;
//	cout << Add(1.3, 1.5) <<endl;
//}


//参数个数不同
//void func(int a, int b, int c)
//{
//	cout << a << " " << b << " " << c << endl;
//}
//
//void func(int a, int b)
//{
//	cout << a << " " << b << endl;
//}
//
//int main()
//{
//	func(1, 2, 3);
//	func(4, 5);
//	return 0;
//}

//参数顺序不同
//void func(int x, double y)
//{
//	cout << x << " " << y << endl;
//}
//
//void func(double x, int y)
//{
//	cout << x << " " << y << endl;
//}
//
//int main()
//{
//	func(1, 3.14);
//	func(3.14, 1);
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	int& b = a;
//	cout << &a << endl << &b << endl;
//
//	return 0;
//}

//#include<iostream>
//using namespace std;
//int main()
//{
//	int a = 10;
//	// 编译报错：“ra”: 必须初始化引⽤
//	//int& ra;
//	int& b = a;
//	int c = 20;
//	// 这⾥让b引⽤c，因为C++引⽤不能改变指向，
//	// 这⾥是⼀个赋值
//	b = c;
//	//b的指向没有改变，a，b还是共用一块空间
//	cout << &a << endl;
//	cout << &b << endl;
//	cout << &c << endl;
//	// b是a别名，b的值改变，即a改变
//	cout << a << " " << b << " " << c << endl;
//
//	return 0;
//}


//void swap(int& ra, int& rb)
//{
//	int ret = ra;
//	ra = rb;
//	rb = ret;
//}
//
//int main()
//{
//	int a = 3, b = 5;
//	swap(a, b);
//
//	return 0;
//}

typedef int STDatatype;

typedef struct Stack
{
	STDatatype* a;
	int top;
	int capacity;
}ST;

void STinit(ST& rs, int n)
{
	rs.a = (STDatatype*)malloc(n * sizeof(STDatatype));
	rs.top = 0;
	rs.capacity = n;
}

void STPush(ST& rs, STDatatype x)
{
	//满了，扩容
	if (rs.top == rs.capacity)
	{
		int newcapacity = rs.capacity == 0 ? 4 : rs.capacity * 2;
		STDatatype* tmp = (STDatatype*)realloc(rs.a, sizeof(STDatatype) * newcapacity);
		if (tmp == NULL)
		{
			perror("realloc");
			return;
		}
		rs.a = tmp;
		rs.capacity = newcapacity;
	}

	rs.a[rs.top] = x;
	++rs.top;
}

//STDatatype& STtop(ST& rs)
//{
//	assert(rs.top > 0);
//	return rs.a[rs.top - 1];
//}

//STDatatype STtop(ST& rs)
//{
//	assert(rs.top > 0);
//	return rs.a[rs.top - 1];
//}

//STDatatype STtop(ST& rs)
//{
//	assert(rs.top > 0);
//	STDatatype top = rs.a[rs.top - 1];
//	return top;
//}

STDatatype& STtop(ST& rs)
{
	assert(rs.top > 0);
	return rs.a[rs.top - 1];
}

int main()
{
	ST s;
	STtop(s)++;
	
	return 0;
}